home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / PIL / FliImagePlugin.py < prev    next >
Text File  |  2006-12-03  |  3KB  |  143 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: FliImagePlugin.py 2134 2004-10-06 08:55:20Z fredrik $
  4. #
  5. # FLI/FLC file handling.
  6. #
  7. # History:
  8. #       95-09-01 fl     Created
  9. #       97-01-03 fl     Fixed parser, setup decoder tile
  10. #       98-07-15 fl     Renamed offset attribute to avoid name clash
  11. #
  12. # Copyright (c) Secret Labs AB 1997-98.
  13. # Copyright (c) Fredrik Lundh 1995-97.
  14. #
  15. # See the README file for information on usage and redistribution.
  16. #
  17.  
  18.  
  19. __version__ = "0.2"
  20.  
  21. import Image, ImageFile, ImagePalette
  22. import string
  23.  
  24.  
  25. def i16(c):
  26.     return ord(c[0]) + (ord(c[1])<<8)
  27.  
  28. def i32(c):
  29.     return ord(c[0]) + (ord(c[1])<<8) + (ord(c[2])<<16) + (ord(c[3])<<24)
  30.  
  31. #
  32. # decoder
  33.  
  34. def _accept(prefix):
  35.     return i16(prefix[4:6]) in [0xAF11, 0xAF12]
  36.  
  37. ##
  38. # Image plugin for the FLI/FLC animation format.  Use the <b>seek</b>
  39. # method to load individual frames.
  40.  
  41. class FliImageFile(ImageFile.ImageFile):
  42.  
  43.     format = "FLI"
  44.     format_description = "Autodesk FLI/FLC Animation"
  45.  
  46.     def _open(self):
  47.  
  48.         # HEAD
  49.         s = self.fp.read(128)
  50.         magic = i16(s[4:6])
  51.         if magic not in [0xAF11, 0xAF12]:
  52.             raise SyntaxError, "not an FLI/FLC file"
  53.  
  54.         # image characteristics
  55.         self.mode = "P"
  56.         self.size = i16(s[8:10]), i16(s[10:12])
  57.  
  58.         # animation speed
  59.         duration = i32(s[16:20])
  60.         if magic == 0xAF11:
  61.             duration = (duration * 1000) / 70
  62.         self.info["duration"] = duration
  63.  
  64.         # look for palette
  65.         palette = map(lambda a: (a,a,a), range(256))
  66.  
  67.         s = self.fp.read(16)
  68.  
  69.         self.__offset = 128
  70.  
  71.         if i16(s[4:6]) == 0xF100:
  72.             # prefix chunk; ignore it
  73.             self.__offset = self.__offset + i32(s)
  74.             s = self.fp.read(16)
  75.  
  76.         if i16(s[4:6]) == 0xF1FA:
  77.             # look for palette chunk
  78.             s = self.fp.read(6)
  79.             if i16(s[4:6]) == 11:
  80.                 self._palette(palette, 2)
  81.             elif i16(s[4:6]) == 4:
  82.                 self._palette(palette, 0)
  83.  
  84.         palette = map(lambda (r,g,b): chr(r)+chr(g)+chr(b), palette)
  85.         self.palette = ImagePalette.raw("RGB", string.join(palette, ""))
  86.  
  87.         # set things up to decode first frame
  88.         self.frame = -1
  89.         self.__fp = self.fp
  90.  
  91.         self.seek(0)
  92.  
  93.     def _palette(self, palette, shift):
  94.         # load palette
  95.  
  96.         i = 0
  97.         for e in range(i16(self.fp.read(2))):
  98.             s = self.fp.read(2)
  99.             i = i + ord(s[0])
  100.             n = ord(s[1])
  101.             if n == 0:
  102.                 n = 256
  103.             s = self.fp.read(n * 3)
  104.             for n in range(0, len(s), 3):
  105.                 r = ord(s[n]) << shift
  106.                 g = ord(s[n+1]) << shift
  107.                 b = ord(s[n+2]) << shift
  108.                 palette[i] = (r, g, b)
  109.                 i = i + 1
  110.  
  111.     def seek(self, frame):
  112.  
  113.         if frame != self.frame + 1:
  114.             raise ValueError, "cannot seek to frame %d" % frame
  115.         self.frame = frame
  116.  
  117.         # move to next frame
  118.         self.fp = self.__fp
  119.         self.fp.seek(self.__offset)
  120.  
  121.         s = self.fp.read(4)
  122.         if not s:
  123.             raise EOFError
  124.  
  125.         framesize = i32(s)
  126.  
  127.         self.decodermaxblock = framesize
  128.         self.tile = [("fli", (0,0)+self.size, self.__offset, None)]
  129.  
  130.         self.__offset = self.__offset + framesize
  131.  
  132.     def tell(self):
  133.  
  134.         return self.frame
  135.  
  136. #
  137. # registry
  138.  
  139. Image.register_open("FLI", FliImageFile, _accept)
  140.  
  141. Image.register_extension("FLI", ".fli")
  142. Image.register_extension("FLI", ".flc")
  143.